package lvm.fonctions.prim.subr;

import lvm.struct.*;
import lvm.fonctions.prim.Primitive;
import lvm.fonctions.prim.fsubr.Quote;
import lvm.Contexte;
import lvm.LvmException;

public class Car extends Subr {
	public static final Car CAR = new Car();

	/**
	 * Constructeur de la classe Car
	 */
	public Car() {
		super("car");
	}

	/**
	 * Exécute la fonction car sur son argument
	 * 
	 * @param arg: l'argument sur lequel exécuter la fonction
	 * @return LA Sexpr résultat de la fonction
	 * @throws LvmException
	 */
	public Sexpr exec(Sexpr arg) throws LvmException {
		// On sélectionne l'unique paramètre de la fonction
		arg = arg.getCar();
		
		if (arg instanceof Liste && arg.getCar() instanceof Symbole) {
			Primitive p = Contexte.getContexteCourant().getPrimitive((Symbole)arg.getCar());
			if (p instanceof Quote)
				return arg.getCdr().getCar();
		}
		
		return arg.eval().getCar();
	}
}
